import { BaseModel } from "@/uni_modules/stars-UniTS-SQLite-ORM/components/stars-UniTS-SQLite-ORM/dbOrm/model/BaseModel";
import { PageModel } from "@/uni_modules/stars-UniTS-SQLite-ORM/components/stars-UniTS-SQLite-ORM/dbOrm/model/PageModel";

export interface ISqliteService<T extends BaseModel> {
	/**
	 * 插入数据。
	 * 该方法接收一个 T 类型的对象，将其存储到数据库中。
	 * 会调用 getColumnsAndValues 方法将对象的属性转换为 SQL 语句中的列和值，并构建插入语句，然后调用 executeSql 方法执行插入操作。
	 * @param model - 要插入的 T 类型的数据对象。
	 */
	insert(model : T) : Promise<void>;

	/**
	 * 根据主键查询数据。
	 * 该方法接收一个主键 id 和 T 类型的构造函数。
	 * 会构建一个根据主键查询的 SQL 语句，执行查询操作，若有结果则调用 mapResultToModel 方法将结果映射为 T 类型的对象，否则返回 null。
	 * @param id - 用于查询的主键值。
	 * @param model - T 类型的构造函数，用于创建查询结果的对象实例。
	 */
	selectById(id : any, model : new () => T) : Promise<T>;

	/**
	 * 查询所有数据。
	 * 该方法接收 T 类型的构造函数。
	 * 会构建一个查询所有数据的 SQL 语句，执行查询操作，并将结果调用 mapResultsToModels 方法映射为 T 类型的对象数组。
	 * @param model - T 类型的构造函数，用于创建查询结果的对象实例。
	 */
	selectAll(model : new () => T) : Promise<T[]>;

	/**
	 * 根据条件查询数据。
	 * 该方法接收一个查询条件和 T 类型的构造函数。
	 * 会构建一个根据条件查询的 SQL 语句，执行查询操作，并将结果调用 mapResultsToModels 方法映射为 T 类型的对象数组。
	 * @param condition - 查询条件，为一个字符串。
	 * @param model - T 类型的构造函数，用于创建查询结果的对象实例。
	 */
	selectByCondition(condition : string, model : new () => T) : Promise<T[]>;

	/**
	 * 分页查询数据。
	 * 该方法接收当前页数、每页大小、可选的查询条件、可选的排序条件和 T 类型的构造函数。
	 * 首先会执行一个 COUNT(*) 查询以获取总条数，然后根据条件、排序和分页信息构建 SQL 语句进行查询操作，将结果映射为 T 类型的对象数组。
	 * 最终返回一个包含当前页数、总条数和数据的 PageModel 对象。
	 * @param page - 当前页数。
	 * @param size - 每页的大小。
	 * @param condition - 可选的查询条件，为一个字符串。
	 * @param orderBy - 可选的排序条件，为一个字符串。
	 * @param model - T 类型的构造函数，用于创建查询结果的对象实例。
	 */
	selectByPage(page : number, size : number, condition ?: string, orderBy ?: string, model : new () => T) : Promise<PageModel>;

	/**
	 * 更新数据。
	 * 该方法接收一个 T 类型的对象。
	 * 会调用 getUpdateSet 方法将对象的属性转换为 SQL 更新语句中的 SET 部分，根据主键构建更新语句，然后调用 executeSql 方法执行更新操作。
	 * @param model - 要更新的 T 类型的数据对象。
	 */
	update(model : T) : Promise<void>;

	/**
	 * 根据主键删除数据。
	 * 该方法接收一个主键 id 和 T 类型的构造函数。
	 * 会构建一个根据主键删除的 SQL 语句，并调用 executeSql 方法执行删除操作。
	 * @param id - 用于删除的主键值。
	 * @param model - T 类型的构造函数，用于确定要删除数据的表。
	 */
	deleteById(id : any, model : new () => T) : Promise<void>;

	/**
	 * 根据条件删除数据。
	 * 该方法接收一个查询条件和 T 类型的构造函数。
	 * 会构建一个根据条件删除的 SQL 语句，并调用 executeSql 方法执行删除操作。
	 * @param condition - 用于删除的查询条件，为一个字符串。
	 * @param model - T 类型的构造函数，用于确定要删除数据的表。
	 */
	deleteByCondition(condition : string, model : new () => T) : Promise<void>;

	// 开始事务
	beginTransaction() : Promise<void>;

	// 提交事务
	commitTransaction() : Promise<void>;

	// 回滚事务
	rollbackTransaction() : Promise<void>;
}